package com.example.demo.spring;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


public class SpringContainerTest {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");


    /**
     *  三级缓存解决循环依赖，第一级存放完整的bean,第二级存放早起未完全初始化的bean，第三级存放bean的创建工厂
     *
     *  假设Bean A依赖B，而B又依赖A
     *  在初始化A的时候发现依赖了B，A无法从缓存中获取到bean，所以A存放到三级缓存中
     *  在初始化B的时候发现依赖了A，从第三级缓存获取到了A，将A从三级缓存中提到耳机缓存中并删除三级缓存中的A，然后B直接可以初始化完毕，并将B放在第一级缓存中
     * 此时回头来初始化A，因为B已经在以及缓存中，所以初始化A的时候可以获取到B，所以A也进入到了以及缓存
     */

    /**
     * Cache of singleton objects: bean name to bean instance.
     */
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

    /**
     * Cache of singleton factories: bean name to ObjectFactory.
     */
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

    /**
     * Cache of early singleton objects: bean name to bean instance.
     */
    private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

}

